MySQL এডভান্সড কুয়েরি লেখার মাধ্যমে আপনি আরও জটিল এবং কার্যকরভাবে ডেটাবেসের তথ্য অনুসন্ধান এবং পরিচালনা করতে পারবেন। নিচে কিছু প্রধান এডভান্সড SQL কুয়েরি এর আলোচনা করা হয়েছে, যা ডেটাবেসের কার্যক্ষমতা এবং স্কেলেবিলিটি বৃদ্ধি করতে সাহায্য করবে।
1. JOIN (INNER JOIN, LEFT JOIN, RIGHT JOIN, FULL OUTER JOIN)
INNER JOIN
INNER JOIN দুটি টেবিলের মধ্যে কমন রেকর্ডগুলো নির্বাচন করে, যেখানে দুটি টেবিলের মধ্যে সম্পর্ক থাকে।
SELECT orders.order_id, customers.customer_name
FROM orders
INNER JOIN customers ON orders.customer_id = customers.customer_id;
এখানে orders এবং customers টেবিলের মধ্যে সম্পর্ক স্থাপন করে, যেখানে customer_id সাধারণ কলাম হিসেবে ব্যবহৃত হচ্ছে।
LEFT JOIN (LEFT OUTER JOIN)
LEFT JOIN প্রথম টেবিলের সমস্ত রেকর্ড এবং দ্বিতীয় টেবিলের মিলের রেকর্ডগুলি রিটার্ন করে। যদি দ্বিতীয় টেবিলে মিল না থাকে, তবে NULL রিটার্ন হয়।
SELECT customers.customer_name, orders.order_id
FROM customers
LEFT JOIN orders ON customers.customer_id = orders.customer_id;
RIGHT JOIN (RIGHT OUTER JOIN)
RIGHT JOIN প্রথমের বিপরীতে, দ্বিতীয় টেবিলের সমস্ত রেকর্ড এবং প্রথম টেবিলের মিলের রেকর্ডগুলি রিটার্ন করে। যদি প্রথম টেবিলে মিল না থাকে, তবে NULL রিটার্ন হয়।
SELECT orders.order_id, customers.customer_name
FROM orders
RIGHT JOIN customers ON orders.customer_id = customers.customer_id;
FULL OUTER JOIN
MySQL এর মধ্যে FULL OUTER JOIN সরাসরি সমর্থিত নয়, তবে আপনি LEFT JOIN এবং RIGHT JOIN ব্যবহার করে এই ধরনের ফলাফল পেতে পারেন।
SELECT orders.order_id, customers.customer_name
FROM orders
LEFT JOIN customers ON orders.customer_id = customers.customer_id
UNION
SELECT orders.order_id, customers.customer_name
FROM orders
RIGHT JOIN customers ON orders.customer_id = customers.customer_id;
2. GROUP BY এবং HAVING
GROUP BY
GROUP BY ক্লজটি এক বা একাধিক কলামের ভিত্তিতে রেকর্ডগুলো গ্রুপ করে এবং প্রতিটি গ্রুপের জন্য অ্যাগ্রিগেট ফাংশন ব্যবহার করতে সাহায্য করে।
SELECT COUNT(*), department
FROM employees
GROUP BY department;
এটি employees টেবিলের department কলাম অনুসারে রেকর্ডগুলো গ্রুপ করবে এবং প্রতিটি গ্রুপের জন্য মোট কর্মচারী সংখ্যা প্রদর্শন করবে।
HAVING
HAVING ক্লজটি GROUP BY এর সাথে ব্যবহৃত হয় এবং এটি গ্রুপিংয়ের পর শর্ত প্রয়োগ করার জন্য ব্যবহৃত হয়। WHERE ক্লজ সাধারণত টেবিলের রেকর্ডগুলো ফিল্টার করতে ব্যবহৃত হয়, তবে HAVING গ্রুপ করা ডেটার উপর শর্ত প্রয়োগ করে।
SELECT department, AVG(salary)
FROM employees
GROUP BY department
HAVING AVG(salary) > 50000;
এটি শুধু সেই বিভাগগুলিকে দেখাবে যাদের গড় বেতন ৫০,০০০ এর বেশি।
3. DISTINCT
DISTINCT ক্লজটি ডুপ্লিকেট রেকর্ড বাদ দিয়ে ইউনিক রেকর্ডগুলি ফিরিয়ে আনে।
SELECT DISTINCT department FROM employees;
এটি employees টেবিল থেকে শুধুমাত্র ইউনিক department এর মান রিটার্ন করবে।
4. SUBQUERY (Nested Query)
একটি subquery একটি কুয়েরির মধ্যে আরেকটি কুয়েরি থাকে। এটি সাধারণত WHERE, FROM, অথবা SELECT ক্লজের মধ্যে ব্যবহৃত হয়।
SUBQUERY in WHERE Clause
SELECT employee_name
FROM employees
WHERE department_id IN (SELECT department_id FROM departments WHERE department_name = 'IT');
এটি প্রথমে departments টেবিল থেকে IT ডিপার্টমেন্টের department_id বের করবে এবং পরে সেই department_id অনুসারে employees টেবিল থেকে কর্মচারী নাম রিটার্ন করবে।
SUBQUERY in FROM Clause
SELECT department_id, AVG(salary)
FROM (SELECT department_id, salary FROM employees WHERE salary > 50000) AS high_salary
GROUP BY department_id;
এখানে, প্রথম সাবকুয়েরি salary ৫০,০০০ এর বেশি এমন কর্মচারীদের সিলেক্ট করছে এবং পরবর্তী কুয়েরি তাদের গড় বেতন গ্রুপ করছে।
5. UNION এবং UNION ALL
UNION
UNION দুইটি কুয়েরির ফলাফল একত্রিত করে, তবে এটি ডুপ্লিকেট রেকর্ডগুলো বাদ দিয়ে মাত্র একবার রিটার্ন করে।
SELECT city FROM customers
UNION
SELECT city FROM suppliers;
এটি customers এবং suppliers টেবিলের শহরগুলো একত্রিত করবে এবং ডুপ্লিকেট বাদ দেবে।
UNION ALL
UNION ALL একইভাবে দুটি কুয়েরির ফলাফল একত্রিত করে, তবে ডুপ্লিকেট রেকর্ডগুলো রাখতে সাহায্য করে।
SELECT city FROM customers
UNION ALL
SELECT city FROM suppliers;
এটি customers এবং suppliers টেবিলের শহরগুলো একত্রিত করবে এবং ডুপ্লিকেট রেকর্ডগুলো রাখবে।
6. LIMIT
LIMIT কুয়েরি ব্যবহার করে আপনি ফলাফল সীমাবদ্ধ করতে পারেন, যা বড় ডেটাবেস থেকে ডেটা টেনে আনার ক্ষেত্রে সহায়ক।
SELECT * FROM employees LIMIT 5;
এটি employees টেবিল থেকে প্রথম ৫টি রেকর্ড রিটার্ন করবে।
7. CASE WHEN (Conditional Statements)
CASE WHEN একটি শর্তানুসারে মান নির্ধারণ করতে ব্যবহৃত হয়।
SELECT employee_name,
CASE
WHEN salary > 50000 THEN 'High Salary'
WHEN salary BETWEEN 30000 AND 50000 THEN 'Medium Salary'
ELSE 'Low Salary'
END AS salary_category
FROM employees;
এটি salary অনুযায়ী কর্মচারীদের জন্য High Salary, Medium Salary, অথবা Low Salary ক্যাটেগরি নির্ধারণ করবে।
সারাংশ
MySQL এডভান্সড কুয়েরি ডেটাবেস থেকে জটিল তথ্য নির্বাচন, আপডেট এবং বিশ্লেষণ করতে অত্যন্ত কার্যকরী। আপনি JOIN, GROUP BY, HAVING, DISTINCT, SUBQUERY, UNION, LIMIT, এবং CASE WHEN এর মতো শক্তিশালী ফিচার ব্যবহার করে ডেটাবেসকে আরও উন্নত ও নির্ভুলভাবে পরিচালনা করতে পারেন। এগুলো ডেটার ফিল্টারিং, গ্রুপিং, এবং অ্যাগ্রিগেটিং সহ আরও অনেক গুরুত্বপূর্ণ কাজ করতে সাহায্য করে।
MySQL-এ WHERE, ORDER BY, এবং LIMIT কন্ডিশনগুলি ডেটাবেসে ডেটা সিলেকশন, ফিল্টারিং, এবং সাজানোর জন্য ব্যবহৃত হয়। এগুলি খুবই শক্তিশালী এবং ব্যাপকভাবে ব্যবহৃত কন্ডিশন। নীচে তাদের ব্যবহার এবং কার্যকারিতা ব্যাখ্যা করা হলো।
1. WHERE কন্ডিশন
WHERE কন্ডিশনটি ডেটাবেস থেকে নির্দিষ্ট শর্ত অনুযায়ী ডেটা নির্বাচন করতে ব্যবহৃত হয়। এটি সাধারণত কুয়েরির ফলাফল ফিল্টার করার জন্য ব্যবহৃত হয়, যাতে শুধুমাত্র নির্দিষ্ট মান বা শর্ত অনুযায়ী ডেটা রিটার্ন করা হয়।
বেসিক সিনট্যাক্স:
SELECT column1, column2, ...
FROM table_name
WHERE condition;
উদাহরণ:
- একটি কলামের নির্দিষ্ট মান অনুসারে ডেটা নির্বাচন:
SELECT * FROM employees
WHERE department = 'Sales';
এটি employees টেবিল থেকে শুধুমাত্র Sales ডিপার্টমেন্টের কর্মচারীদের তথ্য রিটার্ন করবে।
- কিছু শর্তের মধ্যে ডেটা নির্বাচন:
SELECT * FROM employees
WHERE salary > 50000 AND department = 'IT';
এটি employees টেবিল থেকে salary ৫০,০০০ এর বেশি এবং department 'IT' এর কর্মচারীদের রিটার্ন করবে।
- LIKE অপারেটর ব্যবহার:
SELECT * FROM customers
WHERE customer_name LIKE 'John%';
এটি customers টেবিল থেকে সমস্ত customer_name যেগুলো 'John' দিয়ে শুরু হয়, সেগুলো রিটার্ন করবে।
- IN অপারেটর ব্যবহার:
SELECT * FROM orders
WHERE order_id IN (1001, 1003, 1005);
এটি orders টেবিল থেকে order_id ১০০১, ১০০৩ এবং ১০০৫ রিটার্ন করবে।
2. ORDER BY কন্ডিশন
ORDER BY কন্ডিশনটি ডেটাবেসের রেকর্ডগুলো একটি নির্দিষ্ট কোলাম বা ক্ষেত্র অনুসারে সাজাতে ব্যবহৃত হয়। এটি ASC (Ascending) বা DESC (Descending) অর্ডারে সাজানোর জন্য ব্যবহার করা যায়।
বেসিক সিনট্যাক্স:
SELECT column1, column2, ...
FROM table_name
WHERE condition
ORDER BY column_name [ASC|DESC];
উদাহরণ:
- ASC (Ascending) অর্ডারে সাজানো:
SELECT * FROM employees
ORDER BY salary ASC;
এটি employees টেবিলের salary কলামকে ছোট থেকে বড় (অর্থাৎ ASC) সাজিয়ে রিটার্ন করবে।
- DESC (Descending) অর্ডারে সাজানো:
SELECT * FROM employees
ORDER BY salary DESC;
এটি employees টেবিলের salary কলামকে বড় থেকে ছোট (অর্থাৎ DESC) সাজিয়ে রিটার্ন করবে।
- একাধিক কলাম দিয়ে সাজানো:
SELECT * FROM employees
ORDER BY department ASC, salary DESC;
এটি প্রথমে department কলাম অনুযায়ী ASC অর্ডারে সাজাবে এবং একই department এর মধ্যে salary কলাম অনুযায়ী DESC অর্ডারে সাজাবে।
3. LIMIT কন্ডিশন
LIMIT কন্ডিশনটি কুয়েরি থেকে প্রদর্শিত রেকর্ডের সংখ্যা সীমাবদ্ধ করতে ব্যবহৃত হয়। এটি আপনাকে ডেটাবেসের ফলাফল সীমিত করতে সাহায্য করে, বিশেষ করে বড় ডেটাবেসে।
বেসিক সিনট্যাক্স:
SELECT column1, column2, ...
FROM table_name
WHERE condition
ORDER BY column_name [ASC|DESC]
LIMIT number_of_records;
উদাহরণ:
- নির্দিষ্ট সংখ্যক রেকর্ড নির্বাচন:
SELECT * FROM employees
LIMIT 5;
এটি employees টেবিল থেকে প্রথম ৫টি রেকর্ড রিটার্ন করবে।
- WHERE এবং ORDER BY এর সাথে LIMIT ব্যবহার:
SELECT * FROM employees
WHERE department = 'IT'
ORDER BY salary DESC
LIMIT 3;
এটি IT ডিপার্টমেন্টের প্রথম ৩টি সর্বোচ্চ বেতনপ্রাপ্ত কর্মচারী রিটার্ন করবে।
- OFFSET ব্যবহার:
SELECT * FROM employees
LIMIT 5 OFFSET 10;
এটি employees টেবিলের ১১ তম থেকে ১৫ তম রেকর্ড রিটার্ন করবে। এখানে OFFSET ব্যবহার করে প্রথম ১০টি রেকর্ড বাদ দেওয়া হয়েছে।
সারাংশ
- WHERE কন্ডিশনটি ডেটা ফিল্টার করার জন্য ব্যবহৃত হয়, যেখানে আপনি বিভিন্ন শর্ত অনুযায়ী রেকর্ড নির্বাচন করতে পারেন।
- ORDER BY কন্ডিশনটি ডেটা সাজানোর জন্য ব্যবহৃত হয়, যা আপনাকে ASC (Ascending) বা DESC (Descending) অর্ডারে সাজানোর সুবিধা দেয়।
- LIMIT কন্ডিশনটি ডেটা রিটার্নের সংখ্যা সীমিত করতে ব্যবহৃত হয়, যা বড় ডেটাবেসের ক্ষেত্রে খুবই উপকারী।
এই তিনটি কন্ডিশন একত্রে ব্যবহৃত হলে, আপনি অত্যন্ত নির্দিষ্ট ও কার্যকর কুয়েরি তৈরি করতে পারবেন, যা ডেটাবেস থেকে প্রয়োজনীয় তথ্য দ্রুত এবং সহজে বের করে আনবে।
JOIN কুয়েরি দুটি বা তার বেশি টেবিলের মধ্যে সম্পর্ক স্থাপন করে, এবং একসাথে ডেটা নিয়ে আসে। MySQL-এ চারটি প্রধান JOIN অপারেটর রয়েছে: INNER JOIN, LEFT JOIN, RIGHT JOIN, এবং FULL OUTER JOIN। এগুলির প্রত্যেকটি বিভিন্নভাবে টেবিলের মধ্যে সম্পর্ক তৈরি করে এবং বিভিন্ন ধরনের ফলাফল রিটার্ন করে।
1. INNER JOIN
INNER JOIN দুটি টেবিলের মধ্যে মিল থাকা রেকর্ডগুলিকে নির্বাচন করে। অর্থাৎ, যদি দুটি টেবিলের মধ্যে কোনো মিল না থাকে, তবে কোনো রেকর্ড রিটার্ন হয় না।
সyntax:
SELECT column1, column2
FROM table1
INNER JOIN table2
ON table1.column = table2.column;
উদাহরণ:
ধরা যাক, আমাদের দুটি টেবিল রয়েছে: orders এবং customers।
SELECT orders.order_id, customers.customer_name
FROM orders
INNER JOIN customers ON orders.customer_id = customers.customer_id;
এটি orders এবং customers টেবিলের মধ্যে সম্পর্ক স্থাপন করবে এবং যেখানে মিল আছে, সেখানে order_id এবং customer_name রিটার্ন করবে।
2. LEFT JOIN (LEFT OUTER JOIN)
LEFT JOIN বা LEFT OUTER JOIN প্রথম টেবিলের সব রেকর্ড এবং দ্বিতীয় টেবিলের মিল পাওয়া রেকর্ডগুলো রিটার্ন করে। যদি দ্বিতীয় টেবিলে মিল না থাকে, তবে প্রথম টেবিলের রেকর্ড থাকবে এবং দ্বিতীয় টেবিলের কলামগুলো NULL হয়ে যাবে।
সyntax:
SELECT column1, column2
FROM table1
LEFT JOIN table2
ON table1.column = table2.column;
উদাহরণ:
SELECT customers.customer_name, orders.order_id
FROM customers
LEFT JOIN orders ON customers.customer_id = orders.customer_id;
এটি customers টেবিলের সব রেকর্ড দেখাবে, এবং orders টেবিলের রেকর্ড মিল পাওয়া গেলে সেগুলিও দেখাবে। যাদের কোনো মিল পাওয়া যাবে না, তাদের জন্য order_id হবে NULL।
3. RIGHT JOIN (RIGHT OUTER JOIN)
RIGHT JOIN বা RIGHT OUTER JOIN দ্বিতীয় টেবিলের সব রেকর্ড এবং প্রথম টেবিলের মিল পাওয়া রেকর্ডগুলো রিটার্ন করে। যদি প্রথম টেবিলে মিল না থাকে, তবে দ্বিতীয় টেবিলের রেকর্ড থাকবে এবং প্রথম টেবিলের কলামগুলো NULL হয়ে যাবে।
সyntax:
SELECT column1, column2
FROM table1
RIGHT JOIN table2
ON table1.column = table2.column;
উদাহরণ:
SELECT orders.order_id, customers.customer_name
FROM orders
RIGHT JOIN customers ON orders.customer_id = customers.customer_id;
এটি customers টেবিলের সব রেকর্ড দেখাবে, এবং যেখানে মিল পাওয়া যাবে, সেখানে order_id দেখাবে। যাদের মিল পাওয়া যাবে না, তাদের জন্য order_id হবে NULL।
4. FULL OUTER JOIN
MySQL সরাসরি FULL OUTER JOIN সমর্থন করে না। তবে, আপনি LEFT JOIN এবং RIGHT JOIN একসাথে ব্যবহার করে পূর্ণ আউটার জয়েন (FULL OUTER JOIN) এর ফলাফল পেতে পারেন।
সyntax:
SELECT column1, column2
FROM table1
LEFT JOIN table2 ON table1.column = table2.column
UNION
SELECT column1, column2
FROM table1
RIGHT JOIN table2 ON table1.column = table2.column;
উদাহরণ:
SELECT orders.order_id, customers.customer_name
FROM orders
LEFT JOIN customers ON orders.customer_id = customers.customer_id
UNION
SELECT orders.order_id, customers.customer_name
FROM orders
RIGHT JOIN customers ON orders.customer_id = customers.customer_id;
এটি orders এবং customers টেবিলের সব রেকর্ড রিটার্ন করবে, যেখানে মিল পাওয়া যাবে এবং যাদের মিল নেই তাদের জন্য NULL রিটার্ন করবে।
সারাংশ
- INNER JOIN: শুধুমাত্র মিল থাকা রেকর্ডগুলো দেখায়।
- LEFT JOIN: প্রথম টেবিলের সব রেকর্ড এবং মিল পাওয়া রেকর্ডগুলোর জন্য দ্বিতীয় টেবিলের তথ্য দেখায়, যেখানে মিল না থাকলে
NULLদেখায়। - RIGHT JOIN: দ্বিতীয় টেবিলের সব রেকর্ড এবং মিল পাওয়া রেকর্ডগুলোর জন্য প্রথম টেবিলের তথ্য দেখায়, যেখানে মিল না থাকলে
NULLদেখায়। - FULL OUTER JOIN: দুটি টেবিলের সব রেকর্ড রিটার্ন করে, যেখানে মিল না থাকলে
NULLদেখায় (MySQL-এ এটিLEFT JOINএবংRIGHT JOINব্যবহার করে করা যায়)।
এই কুয়েরিগুলো ডেটাবেসে সম্পর্ক স্থাপন করে এবং জটিল তথ্য বিশ্লেষণ করতে সহায়তা করে।
Subquery (সাবকুয়েরি) এবং Nested Query (নেস্টেড কুয়েরি) হল SQL কুয়েরির দুটি গুরুত্বপূর্ণ ধারণা, যেগুলি এক বা একাধিক কুয়েরি একটি কুয়েরির মধ্যে ব্যবহৃত হয়। সাধারণত, একটি সাবকুয়েরি মূল কুয়েরির মধ্যে থাকে এবং প্রধান কুয়েরির আউটপুট ভিত্তি করে কাজ করে। নেস্টেড কুয়েরি হলো আরও সাধারণ ধারণা যেখানে একটি কুয়েরি অন্য কুয়েরির মধ্যে থাকে।
এই দুটি ধারণা প্রাথমিকভাবে একটি কুয়েরি এর ফলাফলকে আরেকটি কুয়েরি দ্বারা ব্যবহার করার জন্য ব্যবহৃত হয়।
1. Subquery (সাবকুয়েরি)
সাবকুয়েরি হল একটি কুয়েরি যা অন্য কুয়েরির মধ্যে ব্যবহৃত হয়। এটি সাধারণত SELECT, INSERT, UPDATE, অথবা DELETE কুয়েরির মধ্যে অন্তর্ভুক্ত থাকে এবং এর ফলাফল মূল কুয়েরির শর্ত হিসেবে ব্যবহার করা হয়।
Subquery in WHERE Clause
এটি মূল কুয়েরির শর্তের মধ্যে একটি সাবকুয়েরি ব্যবহার করার একটি সাধারণ উদাহরণ। এর মাধ্যমে আপনি একটি কুয়েরির ফলাফল অন্য কুয়েরির শর্ত হিসেবে ব্যবহার করতে পারেন।
উদাহরণ:
SELECT employee_name
FROM employees
WHERE department_id IN (SELECT department_id FROM departments WHERE department_name = 'IT');
এখানে, প্রথমে সাবকুয়েরি departments টেবিল থেকে department_id বের করবে যেটি department_name = 'IT' এর জন্য মিলবে। তারপর প্রধান কুয়েরি সেই department_id এর উপর ভিত্তি করে employees টেবিল থেকে সমস্ত কর্মচারীর নাম রিটার্ন করবে।
Subquery in SELECT Clause
সাবকুয়েরি শুধুমাত্র SELECT ক্লজে ব্যবহার করা যায়, যেখানে একটি কুয়েরি অন্য কুয়েরির ফলাফলের উপর ভিত্তি করে মূল্য নির্ধারণ করে।
উদাহরণ:
SELECT employee_name,
(SELECT department_name FROM departments WHERE department_id = employees.department_id) AS department
FROM employees;
এটি employees টেবিল থেকে employee_name রিটার্ন করবে এবং প্রতিটি কর্মচারীর department_name যেটি তাদের department_id এর উপর ভিত্তি করে সাবকুয়েরি দ্বারা নির্ধারিত হবে।
Subquery in FROM Clause
কখনো কখনো সাবকুয়েরি FROM ক্লজেও ব্যবহার করা হয়, যেখানে একটি টেবিলের মতো সাবকুয়েরি ব্যবহার করে মূল কুয়েরি কাজ করতে পারে।
উদাহরণ:
SELECT avg_salary.department_id, AVG(avg_salary.salary)
FROM (SELECT department_id, salary FROM employees WHERE salary > 50000) AS avg_salary
GROUP BY avg_salary.department_id;
এখানে, প্রথম সাবকুয়েরি salary ৫০,০০০ এর বেশি এমন কর্মচারীদের department_id এবং salary সিলেক্ট করছে, এবং পরবর্তী কুয়েরি তাদের গড় বেতন হিসাব করবে।
2. Nested Query (নেস্টেড কুয়েরি)
নেস্টেড কুয়েরি হলো এমন একটি কুয়েরি যেখানে এক কুয়েরি অন্য কুয়েরির ভিতরে অবস্থান করে। এটি সাধারণত সাবকুয়েরির সাথে একসাথে ব্যবহার করা হয়, তবে এটি আরও জেনেরিক শব্দ হিসেবে ব্যবহৃত হয়, যেটি এক কুয়েরির মধ্যে আরেক কুয়েরি থাকা নির্দেশ করে।
সাবকুয়েরি এবং নেস্টেড কুয়েরির মধ্যে পার্থক্য খুব সূক্ষ্ম, এবং তারা প্রায় একে অপরের সাথে বিনিময়যোগ্য হতে পারে। তবে সাধারণভাবে, নেস্টেড কুয়েরি এমন কুয়েরি যা একাধিক স্তরের কুয়েরি অন্তর্ভুক্ত করে।
Nested Query Example
SELECT employee_name, salary
FROM employees
WHERE department_id = (SELECT department_id FROM departments WHERE department_name = 'HR');
এটি একটি নেস্টেড কুয়েরি, যেখানে একটি কুয়েরি (উপরে দেওয়া সাবকুয়েরি) অন্য কুয়েরির মধ্যে ব্যবহার করা হয়েছে।
Nested Query with Multiple Levels
একটি নেস্টেড কুয়েরি একাধিক স্তরে থাকতে পারে, যেমন:
SELECT employee_name
FROM employees
WHERE department_id = (
SELECT department_id
FROM departments
WHERE department_name = (
SELECT department_name
FROM departments
WHERE department_id = 2
)
);
এটি তিনটি স্তরের নেস্টেড কুয়েরি। প্রথমে department_id = 2 এর জন্য department_name পাওয়া যাবে, তারপর সেই department_name দিয়ে দ্বিতীয় স্তরের কুয়েরি থেকে department_id পাওয়া যাবে, এবং শেষপর্যন্ত, সেই department_id এর জন্য কর্মচারী নামগুলো রিটার্ন করা হবে।
3. Correlated Subquery (করিলেটেড সাবকুয়েরি)
করিলেটেড সাবকুয়েরি এমন একটি সাবকুয়েরি যা মূল কুয়েরির প্রতিটি রেকর্ডের জন্য পুনরায় চালানো হয়। এটি মূল কুয়েরির কলাম থেকে ডেটা ব্যবহার করে এবং এটি একে অপরের সাথে সম্পর্কিত।
উদাহরণ:
SELECT employee_name, salary
FROM employees e
WHERE salary > (SELECT AVG(salary) FROM employees WHERE department_id = e.department_id);
এখানে, সাবকুয়েরি employees টেবিলের department_id এর উপর ভিত্তি করে গড় বেতন বের করছে এবং মূল কুয়েরি শুধুমাত্র সেই কর্মচারীদের রিটার্ন করবে যারা তাদের বিভাগে গড় বেতনের চেয়ে বেশি বেতন পায়।
4. Existential Subquery (EXISTS Subquery)
EXISTS সাবকুয়েরি একটি বুলিয়ান মান রিটার্ন করে, যেখানে আপনি যাচাই করতে পারেন যে সাবকুয়েরি একটি রেকর্ড রিটার্ন করে কিনা। এটি সাধারণত একটি শর্ত হিসেবে ব্যবহার করা হয়।
উদাহরণ:
SELECT employee_name
FROM employees e
WHERE EXISTS (SELECT * FROM departments d WHERE d.department_id = e.department_id AND d.department_name = 'IT');
এটি চেক করবে যে employees টেবিলের প্রতিটি কর্মচারী IT ডিপার্টমেন্টের সাথে সম্পর্কিত কিনা। যদি সম্পর্ক থাকে, তবে সেই কর্মচারীর নাম রিটার্ন করবে।
সারাংশ
Subquery এবং Nested Query উভয়ই SQL এর অত্যন্ত শক্তিশালী এবং গুরুত্বপূর্ণ বৈশিষ্ট্য যা জটিল কুয়েরি লেখা এবং ডেটাবেসের কার্যক্ষমতা বাড়াতে সাহায্য করে। Subquery মূল কুয়েরির অংশ হয়ে থাকে এবং তার ফলাফল শর্ত হিসেবে ব্যবহার করা হয়। অন্যদিকে, Nested Query সাধারণত একাধিক স্তরের কুয়েরি ব্যবহার করে, যেখানে একটি কুয়েরি আরেকটি কুয়েরির ভিতরে থাকে। Correlated Subquery, EXISTS Subquery এবং অন্যান্য ধরনের সাবকুয়েরি ডেটাবেসের আরও উন্নত কার্যক্ষমতার জন্য ব্যবহৃত হয়।
MySQL এর aggregate functions ডেটাবেসে উপস্থিত ডেটার উপর গণনা বা উপসংহার টানতে ব্যবহৃত হয়। এগুলি বিশেষভাবে GROUP BY ক্লজের সাথে ব্যবহৃত হয়, তবে একক রেকর্ড (row) বা ডেটাবেসের সকল রেকর্ডের উপরও কাজ করতে পারে। MySQL-এ বেশ কিছু জনপ্রিয় aggregate functions রয়েছে, যেমন COUNT, SUM, AVG, MIN, এবং MAX। নিচে এই ফাংশনগুলির ব্যাখ্যা এবং উদাহরণ দেওয়া হলো।
1. COUNT()
COUNT() ফাংশনটি নির্দিষ্ট কলামে থাকা রেকর্ডের সংখ্যা নির্ধারণ করে। এটি সাধারণত টেবিলের বা গ্রুপের মধ্যে মোট রেকর্ডের সংখ্যা বের করার জন্য ব্যবহৃত হয়।
Syntax:
SELECT COUNT(column_name)
FROM table_name;
Example:
SELECT COUNT(*) AS total_employees
FROM employees;
এটি employees টেবিলের মোট রেকর্ডের সংখ্যা (অর্থাৎ কর্মচারীদের সংখ্যা) প্রদান করবে।
COUNT with WHERE clause:
SELECT COUNT(*) AS active_employees
FROM employees
WHERE status = 'Active';
এটি শুধুমাত্র সক্রিয় কর্মচারীদের সংখ্যা ফিরিয়ে দেবে যাদের status কলাম Active।
2. SUM()
SUM() ফাংশনটি একটি নির্দিষ্ট সংখ্যার কলামের মোট মান গণনা করে, যেমন বেতন, বিক্রয় ইত্যাদি।
Syntax:
SELECT SUM(column_name)
FROM table_name;
Example:
SELECT SUM(salary) AS total_salary
FROM employees;
এটি employees টেবিল থেকে সমস্ত কর্মচারীর মোট বেতন হিসাব করবে।
SUM with GROUP BY:
SELECT department, SUM(salary) AS total_salary
FROM employees
GROUP BY department;
এটি প্রতিটি ডিপার্টমেন্টের মোট বেতন যোগ করে দেখাবে।
3. AVG()
AVG() ফাংশনটি একটি নির্দিষ্ট কলামে থাকা সংখ্যাগুলির গড় (average) মান নির্ধারণ করে।
Syntax:
SELECT AVG(column_name)
FROM table_name;
Example:
SELECT AVG(salary) AS average_salary
FROM employees;
এটি employees টেবিলের সমস্ত কর্মচারীদের গড় বেতন ফিরিয়ে দেবে।
AVG with GROUP BY:
SELECT department, AVG(salary) AS average_salary
FROM employees
GROUP BY department;
এটি প্রতিটি ডিপার্টমেন্টের গড় বেতন দেখাবে।
4. MIN()
MIN() ফাংশনটি একটি কলামে উপস্থিত সবচেয়ে ছোট মান (smallest value) বের করে। এটি সাধারণত ডেটার মধ্যে সবচেয়ে ছোট মান বা সবচেয়ে কম সংখ্যার খোঁজ করতে ব্যবহৃত হয়।
Syntax:
SELECT MIN(column_name)
FROM table_name;
Example:
SELECT MIN(salary) AS lowest_salary
FROM employees;
এটি employees টেবিল থেকে সর্বনিম্ন বেতন ফিরিয়ে দেবে।
MIN with GROUP BY:
SELECT department, MIN(salary) AS lowest_salary
FROM employees
GROUP BY department;
এটি প্রতিটি ডিপার্টমেন্টে সর্বনিম্ন বেতন দেখাবে।
5. MAX()
MAX() ফাংশনটি একটি কলামে উপস্থিত সবচেয়ে বড় মান (largest value) বের করে। এটি ডেটা বিশ্লেষণ করে সবচেয়ে বড় বা সর্বোচ্চ মান নির্ধারণ করতে ব্যবহৃত হয়।
Syntax:
SELECT MAX(column_name)
FROM table_name;
Example:
SELECT MAX(salary) AS highest_salary
FROM employees;
এটি employees টেবিল থেকে সর্বোচ্চ বেতন ফিরিয়ে দেবে।
MAX with GROUP BY:
SELECT department, MAX(salary) AS highest_salary
FROM employees
GROUP BY department;
এটি প্রতিটি ডিপার্টমেন্টে সর্বোচ্চ বেতন দেখাবে।
Summary of Aggregate Functions
| Function | Description | Example SQL |
|---|---|---|
| COUNT() | Total number of rows or non-NULL values | SELECT COUNT(*) FROM employees; |
| SUM() | Total sum of a numeric column | SELECT SUM(salary) FROM employees; |
| AVG() | Average value of a numeric column | SELECT AVG(salary) FROM employees; |
| MIN() | Minimum value of a column | SELECT MIN(salary) FROM employees; |
| MAX() | Maximum value of a column | SELECT MAX(salary) FROM employees; |
Combined Use of Aggregate Functions
You can combine multiple aggregate functions in a single query. For example:
SELECT department,
COUNT(*) AS total_employees,
AVG(salary) AS average_salary,
MAX(salary) AS highest_salary,
MIN(salary) AS lowest_salary
FROM employees
GROUP BY department;
এটি employees টেবিল থেকে প্রতিটি ডিপার্টমেন্টের মোট কর্মচারী সংখ্যা, গড় বেতন, সর্বোচ্চ বেতন এবং সর্বনিম্ন বেতন একসাথে প্রদর্শন করবে।
সারাংশ
MySQL-এ aggregate functions যেমন COUNT, SUM, AVG, MIN, এবং MAX ডেটাবেসের তথ্য বিশ্লেষণ এবং গণনা করতে সহায়ক। এগুলি ডেটাবেসের বিশাল পরিমাণ ডেটা থেকে মানদণ্ড নির্ধারণ, গড় হিসাব, মোট বেতন যোগ করা, বা সর্বোচ্চ/সর্বনিম্ন মান বের করতে সাহায্য করে। GROUP BY ক্লজের সাথে এই ফাংশনগুলি ব্যবহার করে আপনি বিভিন্ন গ্রুপের ভিত্তিতে ফলাফল পেতে পারেন।
MySQL-এ GROUP BY এবং HAVING ক্লজ দুটি ডেটা গ্রুপিং এবং গ্রুপের উপর শর্ত প্রয়োগ করার জন্য ব্যবহৃত হয়। এগুলি সাধারণত একসাথে ব্যবহৃত হয়, যেখানে GROUP BY প্রথমে ডেটা গ্রুপ করে এবং তারপরে HAVING সেই গ্রুপের উপর শর্ত প্রয়োগ করে।
GROUP BY
GROUP BY ক্লজটি ব্যবহার করে আপনি একটি টেবিলের ডেটা নির্দিষ্ট কলামের ভিত্তিতে গ্রুপ করতে পারেন এবং তারপরে প্রতিটি গ্রুপের জন্য অ্যাগ্রিগেট ফাংশন ব্যবহার করতে পারেন (যেমন COUNT(), SUM(), AVG(), MAX(), MIN() ইত্যাদি)। এটি সাধারণত ডেটা বিশ্লেষণ এবং সংক্ষেপণের জন্য ব্যবহৃত হয়।
GROUP BY সিনট্যাক্স:
SELECT column_name(s), AGGREGATE_FUNCTION(column_name)
FROM table_name
GROUP BY column_name(s);
এখানে:
column_name(s)হলো গ্রুপিংয়ের জন্য ব্যবহার করা কলাম।AGGREGATE_FUNCTION(column_name)হলো যে অ্যাগ্রিগেট ফাংশনটি আপনি ব্যবহার করতে চান (যেমনCOUNT,SUM,AVG, ইত্যাদি)।
GROUP BY এর উদাহরণ:
ধরা যাক, আমাদের কাছে একটি employees টেবিল আছে এবং আমরা জানি যে প্রতিটি কর্মচারী একটি নির্দিষ্ট department_id এর অধীনে কাজ করে। আমরা প্রতিটি department_id এর জন্য কর্মচারীদের সংখ্যা দেখতে চাই।
SELECT department_id, COUNT(*) AS total_employees
FROM employees
GROUP BY department_id;
এটি employees টেবিলের প্রতিটি department_id এর জন্য কর্মচারীর সংখ্যা total_employees হিসেবে দেখাবে।
HAVING
HAVING ক্লজটি GROUP BY এর পর ব্যবহৃত হয় এবং এটি গ্রুপকৃত ডেটার উপর শর্ত প্রয়োগ করতে ব্যবহৃত হয়। এটি সাধারণত অ্যাগ্রিগেট ফাংশনের সাথে ব্যবহৃত হয় এবং WHERE ক্লজের মতোই কাজ করে, তবে পার্থক্য হলো WHERE ক্লজ ডেটা গ্রুপ করার আগে শর্ত প্রয়োগ করে, আর HAVING গ্রুপ করার পরে শর্ত প্রয়োগ করে।
HAVING সিনট্যাক্স:
SELECT column_name(s), AGGREGATE_FUNCTION(column_name)
FROM table_name
GROUP BY column_name(s)
HAVING condition;
HAVING এর উদাহরণ:
ধরা যাক, আপনি পূর্ববর্তী উদাহরণে department_id অনুযায়ী কর্মচারীদের সংখ্যা দেখতে চাই, তবে শুধুমাত্র সেই ডিপার্টমেন্টগুলির জন্য যেখানে কর্মচারীর সংখ্যা ১০ এর বেশি। এখানে HAVING ক্লজ ব্যবহার করা হবে:
SELECT department_id, COUNT(*) AS total_employees
FROM employees
GROUP BY department_id
HAVING COUNT(*) > 10;
এটি শুধু সেই ডিপার্টমেন্টগুলো দেখাবে যেখানে কর্মচারীর সংখ্যা ১০ এর বেশি।
GROUP BY এবং HAVING একসাথে ব্যবহার
অনেক সময় GROUP BY এবং HAVING একসাথে ব্যবহৃত হয়, যেখানে GROUP BY দিয়ে ডেটা গ্রুপ করা হয় এবং তারপর HAVING দিয়ে শর্ত প্রয়োগ করা হয়।
একটি উদাহরণ:
ধরা যাক, আমরা চাই employees টেবিল থেকে প্রতিটি department_id এর গড় বেতন বের করতে, তবে আমরা শুধুমাত্র সেই ডিপার্টমেন্টগুলো দেখতে চাই, যেখানে গড় বেতন ৫০,০০০ এর বেশি।
SELECT department_id, AVG(salary) AS avg_salary
FROM employees
GROUP BY department_id
HAVING AVG(salary) > 50000;
এটি শুধুমাত্র সেই department_id গুলি দেখাবে যাদের গড় বেতন ৫০,০০০ এর বেশি।
GROUP BY এবং HAVING এর মধ্যে পার্থক্য
- GROUP BY: ডেটাকে গ্রুপ করে এবং গ্রুপের উপর অ্যাগ্রিগেট ফাংশন প্রয়োগ করে।
- HAVING: গ্রুপকৃত ডেটার উপর শর্ত প্রয়োগ করে, এবং অ্যাগ্রিগেট ফাংশনের ফলাফলের উপর ভিত্তি করে শর্ত প্রয়োগ করতে সাহায্য করে।
WHEREক্লজের মতো, কিন্তুWHEREডেটা গ্রুপ করার আগে এবংHAVINGগ্রুপ করার পরে প্রয়োগ হয়।
সারাংশ
- GROUP BY ক্লজটি ডেটাকে একটি নির্দিষ্ট কলামের ভিত্তিতে গ্রুপ করে এবং প্রতি গ্রুপের জন্য অ্যাগ্রিগেট ফাংশন প্রয়োগ করে।
- HAVING ক্লজটি GROUP BY এর পর গ্রুপকৃত ডেটার উপর শর্ত প্রয়োগ করতে ব্যবহৃত হয়।
- GROUP BY এবং HAVING একসাথে ব্যবহার করে আপনি আরও উন্নত এবং জটিল ডেটাবেস বিশ্লেষণ করতে পারবেন।
Read more